package ProyectoX;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.Timer;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

import Casillero.Casillero;
import Robot.Robot;
import Robot.RobotCivil;
import Robot.RobotMilitar;


public class Partida extends JPanel implements ActionListener{
	
	protected Juego juego;
	protected Robot robot;
	protected Tablero tablero;
	protected Timer timer;
	protected boolean ganar;
	protected boolean perder;
	protected ImageIcon rojo,verde,pila,puntos;
	protected ImageIcon arriva,abajo,derecha,izquierda;
	protected ImageIcon pincel,disparo,cono,baliza,agarrar,abrir;
	
	public Partida(Juego j,Robot r,Tablero t){
		setFocusable(true);
        setDoubleBuffered(true);
        tablero=t;
		juego=j;
		robot=r;
		ganar=false;
		perder=false;
		
		arriva=new ImageIcon(this.getClass().getResource("/Botones/flechaU.png"));
		abajo=new ImageIcon(this.getClass().getResource("/Botones/flechaD.png"));
		derecha=new ImageIcon(this.getClass().getResource("/Botones/flechaR.png"));
		izquierda=new ImageIcon(this.getClass().getResource("/Botones/flechaL.png"));
		
		pincel=new ImageIcon(this.getClass().getResource("/Botones/pincel.png"));
		disparo=new ImageIcon(this.getClass().getResource("/Botones/bala.png"));
		agarrar=new ImageIcon(this.getClass().getResource("/Botones/agarrar.png"));
		cono=new ImageIcon(this.getClass().getResource("/Botones/cono.png"));
		baliza=new ImageIcon(this.getClass().getResource("/Botones/baliza.png"));
		abrir=new ImageIcon(this.getClass().getResource("/Botones/key.png"));
		
		puntos=new ImageIcon(this.getClass().getResource("/Premio/puntos.png"));
		rojo=new ImageIcon(this.getClass().getResource("/ProyectoX/rojo.png"));
		verde=new ImageIcon(this.getClass().getResource("/ProyectoX/verde.png"));
		pila=new ImageIcon(this.getClass().getResource("/ProyectoX/pila.png"));
		
		setBackground(Color.BLACK);
		this.addKeyListener(new Oyente());
		this.addMouseListener(new Oyente2());

		timer = new Timer(31, this);
        timer.start();	
	}

	/**
	 * Metodo que se actualiza cada 31 ms
	 */
	
	public void actionPerformed(ActionEvent e) {
		repaint();
		if(ganar){
			juego.reiniciar(true);
			timer.stop();
		}
		else if(perder){
			juego.reiniciar(false);
			timer.stop();
		}
	}

	/**
	 * Actualiza la imagen del juego
	 */
	
	public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        ImageIcon ii;
        
        //botones
        ii=izquierda;
        g.drawImage(ii.getImage(),5,32*12,this);
        ii=abajo;
        g.drawImage(ii.getImage(),5+32+3,32*12,this);
        ii=arriva;
        g.drawImage(ii.getImage(),5+32+3,32*11,this);
        ii=derecha;
        g.drawImage(ii.getImage(),5+32*2+3*2,32*12,this);
        ii=disparo;
        g.drawImage(ii.getImage(),5+32*3+3*3,32*11,32*2,32*2,this);
        ii=pincel;
        g.drawImage(ii.getImage(),5+32*5+3*4,32*11,32,32*2,this);
        ii=abrir;
        g.drawImage(ii.getImage(),5+32*6+3*5,32*11,32,32*2,this);
        ii=cono;
        g.drawImage(ii.getImage(),5+32*7+3*6,32*11,this);
        ii=baliza;
        g.drawImage(ii.getImage(),5+32*8+3*7,32*11,this);
        ii=agarrar;
        g.drawImage(ii.getImage(),5+32*7+3*6,32*12,32*2,32,this);


        //Pila y energia
        
        ii=pila;
        g.drawImage(ii.getImage(),0,0,this);
        if(robot.getEnergia()<(robot.getEnergiaMax()/3))
        	ii=rojo;
        else
        	ii=verde;
        g.drawImage(ii.getImage(),43,10,50*robot.getEnergia()/robot.getEnergiaMax(),10,this);
        
        //Tablero
        
        for(int i=0;i<tablero.getX();i++)
        	for(int j=0;j<tablero.getY();j++){
        		g.drawImage(tablero.getCasillero(i,j).getII().getImage(),i*32,j*32+32,this);
        		if(tablero.getCasillero(i,j).pintado()){
        			g.drawImage(tablero.getCasillero(i,j).getPinII().getImage(),i*32,j*32+32,this);
        			//System.out.println("entro");
        		}
        		if(tablero.getCasillero(i,j).tieneAlgo())
        			g.drawImage(tablero.getCasillero(i,j).getSegII().getImage(),i*32,j*32+32,this);
        	}
        
        //Numeros de la energia
        
        for(int i=0;i<robot.getEnergiaS().length();i++){
        	ii=new ImageIcon(this.getClass().getResource("/Numeros/"+robot.getEnergiaS().charAt(i)+".png"));
        	g.drawImage(ii.getImage(),96+i*16,0,this);
        }
        
        //Numeros de las municiones
        
        for(int i=0;i<robot.getMunicionesS().length();i++){
        	ii=new ImageIcon(this.getClass().getResource("/Numeros/"+robot.getMunicionesS().charAt(i)+".png"));
        	if(robot.getMunicionesS().length()<2)
        		g.drawImage(ii.getImage(),5+32*3+3*3+14+i*16,32*11+16,this);
        	else
        		g.drawImage(ii.getImage(),5+32*3+3*3+8+i*16,32*11+16,this);
        }
        
        //Puntos
        for(int i=0;i<robot.getPuntosS().length();i++){
        	ii=new ImageIcon(this.getClass().getResource("/Numeros/"+robot.getPuntosS().charAt(i)+".png"));
        	g.drawImage(ii.getImage(),250+i*16,0,this);
        }
        ii=puntos;
        g.drawImage(ii.getImage(),230,0,this);
        
        //Numeros de las balizas
        for(int i=0;i<robot.getBalizasS().length();i++){
        	ii=new ImageIcon(this.getClass().getResource("/Numeros/"+robot.getBalizasS().charAt(i)+".png"));
        	g.drawImage(ii.getImage(),4+32*8+3*7+i*16,32*11,this);
        }
        
      //Numeros de los conos
        for(int i=0;i<robot.getConosS().length();i++){
        	ii=new ImageIcon(this.getClass().getResource("/Numeros/"+robot.getConosS().charAt(i)+".png"));
        	g.drawImage(ii.getImage(),2+32*7+3*7+i*16,32*11,this);
        }
        
        //Robot       
        g.drawImage(robot.getII().getImage(), robot.getX()*32, robot.getY()*32+32, this);
        g.dispose();
    }

	/**
	 * retorna el timer de partida
	 * @return
	 */
	public Timer getTimer() {
		return timer;
	}
	
	private class Oyente extends KeyAdapter{
	
		protected int cont;
		//Gira o mueve el robot al precionar flechas de movimiento
		public Oyente(){
			cont=7;
		}
		
		public void keyPressed(KeyEvent e){
			int key=e.getKeyCode();
			switch(key){
				case KeyEvent.VK_LEFT:robot.girarIzquierda();
					break;
				case KeyEvent.VK_RIGHT:robot.girarDerecha();
					break;
				case KeyEvent.VK_UP:
				{
					Casillero c;
					int posx=robot.getX();
					int posy=robot.getY();
					switch(robot.getDireccion())
					{
					case 'u':posy-=1;
							break;
					case 'd':posy+=1;
							break;
					case 'r':posx+=1;
							break;
					case 'l':posx-=1;
							break;
					}
					if(tablero.puedeAvanzar(posx, posy)){
						c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(posx, posy).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(posx, posy))&&!perder){
							ganar=true;
						}
						
					}
				}
				break;
				case KeyEvent.VK_D:{
					
					if (cont==7){
					robot.disparar(juego,tablero);
					cont=0;
					}
					else cont++;
				}
				break;
				case KeyEvent.VK_A:{
					robot.abrirCofre(tablero);
				}
				break;
				case KeyEvent.VK_Z:{
					robot.activarPincel();
					if(robot.getColor())
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelRojo.png"));					
					else
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelVerde.png"));
					tablero.getCasillero(robot.getX(),robot.getY()).pintar(robot.getColor());
				}
				break;
				case KeyEvent.VK_X:{
					robot.desactivarPincel();
					pincel=new ImageIcon(this.getClass().getResource("/Botones/pincel.png"));
				}
				break;
				case KeyEvent.VK_C:{
					robot.cambiarColor();
					if(robot.getPincel()){
					if(robot.getColor())
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelRojo.png"));					
					else
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelVerde.png"));
					if(tablero.getCasillero(robot.getX(),robot.getY()).pintado())
					tablero.getCasillero(robot.getX(),robot.getY()).pintar(robot.getColor());
					}
				}
				break;
				case KeyEvent.VK_Q:{
					robot.agarrar(tablero);
				}
				break;
				case KeyEvent.VK_W:{
					robot.descargarCono(tablero);
				}
				break;
				case KeyEvent.VK_E:{
					robot.descargarBaliza(tablero);
				}
				break;
			}
		}
		public void  keyReleased(KeyEvent e){
			int key=e.getKeyCode();
			if (key==KeyEvent.VK_D)cont=7;
		}
	}
	private class Oyente2 extends MouseAdapter{
		
		public void mousePressed(MouseEvent e){
			
			//boton izquierda
			if(e.getX()>5&&e.getX()<5+32&&e.getY()>32*12&&e.getY()<32*12+32){
				switch(robot.getDireccion()){
				case 'u':{
					robot.girarIzquierda();
					if(tablero.puedeAvanzar(robot.getX()-1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()-1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'd':{
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX()-1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()-1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'r':{
					robot.girarDerecha();
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX()-1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()-1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'l':{
					if(tablero.puedeAvanzar(robot.getX()-1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()-1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				}
			}
			//boton abajo
			if(e.getX()>5+32+3&&e.getX()<5+32*2+3&&e.getY()>32*12&&e.getY()<32*12+32){
				switch(robot.getDireccion()){
				case 'u':{
					robot.girarIzquierda();
					robot.girarIzquierda();
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()+1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()+1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'd':{
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()+1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()+1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'r':{
					robot.girarDerecha();
					
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()+1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()+1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'l':{
					robot.girarIzquierda();
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()+1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()+1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				}
			}
			//boton arriba
			if(e.getX()>5+32+3&&e.getX()<5+32*2+3&&e.getY()>32*11&&e.getY()<32*11+32){
				switch(robot.getDireccion()){
				case 'u':{
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()-1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()-1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'd':{
					robot.girarDerecha();
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()-1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()-1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'r':{
					robot.girarIzquierda();
					
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()-1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()-1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'l':{
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX(), robot.getY()-1)){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX(), robot.getY()-1).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				}
			}
			//boton derecha
			if(e.getX()>5+32*2+3*2&&e.getX()<5+32*3+3*2&&e.getY()>32*12&&e.getY()<32*12+32){
				switch(robot.getDireccion()){
				case 'u':{
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX()+1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()+1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'd':{
					robot.girarIzquierda();
					if(tablero.puedeAvanzar(robot.getX()+1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()+1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'r':{
					
					
					if(tablero.puedeAvanzar(robot.getX()+1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()+1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				case 'l':{
					robot.girarDerecha();
					robot.girarDerecha();
					if(tablero.puedeAvanzar(robot.getX()+1, robot.getY())){
						Casillero c=tablero.getCasillero(robot.getX(), robot.getY());
						if(c.getPremio()!=null){
							c.getPremio().modificarRobot(robot);
							c.setPremio(null);
						}
						if(robot.getPincel()){
							tablero.getCasillero(robot.getX()+1, robot.getY()).pintar(robot.getColor());
						}
						robot.avanzar(c.getConsumo());
						if(robot.getEnergia()<=0){
							perder=true;
						}
						if(tablero.esFinal(tablero.getCasillero(robot.getX(), robot.getY()))&&!perder){
							ganar=true;
						}
					}
				}
				break;
				}
			}
			//disparar
			if(e.getX()>5+32*3+3*3&&e.getX()<5+32*5+3*3&&e.getY()>32*11&&e.getY()<32*12+32){
				robot.disparar(juego,tablero);
			}
			//pincel
			if(e.getX()>5+32*5+3*4&&e.getX()<5+32*6+3*4&&e.getY()>32*11&&e.getY()<32*12+32){
				if(robot.getPincel()){
					if(robot.getColor()){
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelVerde.png"));
						robot.cambiarColor();
						tablero.getCasillero(robot.getX(),robot.getY()).pintar(robot.getColor());
					}
					else{
						robot.desactivarPincel();
						robot.cambiarColor();
						pincel=new ImageIcon(this.getClass().getResource("/Botones/pincel.png"));
					}
				}
				else{
					robot.activarPincel();
					pincel=new ImageIcon(this.getClass().getResource("/Botones/pincelRojo.png"));
					tablero.getCasillero(robot.getX(),robot.getY()).pintar(robot.getColor());
				}
			}
			//abrir
			if(e.getX()>5+32*6+3*5&&e.getX()<5+32*7+3*5&&e.getY()>32*11&&e.getY()<32*12+32){
				robot.abrirCofre(tablero);
			}
			//agarrar
			if(e.getX()>5+32*7+3*6&&e.getX()<5+32*9+3*6&&e.getY()>32*12&&e.getY()<32*12+32){
				robot.agarrar(tablero);
			}
			//descargar cono
			if(e.getX()>5+32*7+3*6&&e.getX()<5+32*8+3*6&&e.getY()>32*11&&e.getY()<32*11+32){
				robot.descargarCono(tablero);
			}
			if(e.getX()>5+32*8+3*7&&e.getX()<5+32*9+3*7&&e.getY()>32*11&&e.getY()<32*11+32){
				robot.descargarBaliza(tablero);
			}
		}	
	}

}
